﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="DefalutSchema"
    elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:documentation xml:lang="en">
      Schema for validation EditModule configs
      Copyright 2013 Andrii Motrych. All rights reserved.
    </xs:documentation>
  </xs:annotation>
  <xs:element name="root" type="RootElementType"/>
  <xs:complexType name="RootElementType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Корневой элемент настроек
      </xs:documentation>
    </xs:annotation>
    <xs:all>
      <xs:element name="Configs" type="ConfigsType" minOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Секция общих настроек и настроек инфо модуля
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="EditModule" type="EditModuleType" minOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Секция настроек Формы Редактирования
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:all>
  </xs:complexType>

  <xs:complexType name ="ConfigsType">
    <xs:all>
      <xs:element name="ViewCaption" minOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Заголовок для Инфо модуля
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="ProcIU" minOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Имя процедуры вставки и модификации
          </xs:documentation>
        </xs:annotation>

        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="SourceTable" minOccurs="0">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Без понятия
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="Representation" minOccurs="0">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Без понятия
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="Name" type="xs:string"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="XmlIU" minOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Имя процедуры для получения значений "по-умолчанию" и конкретной записи
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:attribute name="Name" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="ProcD" minOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Имя процедуры удаления конкретной записи
          </xs:documentation>
        </xs:annotation>
          <xs:complexType>
            <xs:attribute name="Name" type="xs:string" />
          </xs:complexType>
      </xs:element>
      <xs:element name="FirstRun">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="Name" type="xs:string" />
              <xs:attribute name="State" type="xs:string"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="Fields">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Без понятия)
          </xs:documentation>
        </xs:annotation>
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:any processContents="skip" namespace="##any"></xs:any>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:all>
  </xs:complexType>
  
  <xs:simpleType name="StartPositionType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Тип начальной позиции формы
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Manual"                       />
      <xs:enumeration value="CenterScreen"                 />
      <xs:enumeration value="WindowsDefaultLocation"       />
      <xs:enumeration value="WindowsDefaultBounds"         />
      <xs:enumeration value="CenterParent"                 />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="WindowStateType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Представляет собой состояние формы при отображении
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Normal"                       />
      <xs:enumeration value="Minimized"                 />
      <xs:enumeration value="Maximized"       />
    </xs:restriction>
  </xs:simpleType>
  
  <xs:complexType name="FormConfigsType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Конфигурация для конкретного экземпляра формы
      </xs:documentation>
    </xs:annotation>
    <xs:all>
      <xs:element name="Text" type="xs:string" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Заголовок Формы редактирования
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Width" type="xs:positiveInteger" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Значение ширины формы
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Height" type="xs:positiveInteger" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Значение высоты формы
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="StartPosition" type="StartPositionType" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Значение начальной позиции формы
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="WindowState" type="WindowStateType" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Значение начального состояния окна формы
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:all>
  </xs:complexType>
  <xs:complexType name ="EditModuleType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Секция настроек типов полей, визуального отображения и поведения формы
      </xs:documentation>
    </xs:annotation>
    <xs:all>
      <xs:element name="Configs" type="FormConfigsType" minOccurs="0">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Секция настроек окна формы
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Controls" type="ControlsType" minOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Секция корневых визуальных элементов
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Dependencies" type="DependenciesType" minOccurs="0">
        <xs:annotation>
          <xs:documentation xml:lang="ru">
            Секция описания зависимостей визуальных элементов
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:all>
  </xs:complexType>

  <xs:complexType name ="DependenciesType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Конфигурация зависимостей графических контролов между собой.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element maxOccurs="unbounded" name="Dependence">
        <xs:complexType>
          <xs:attribute name="ChangedControl" type="xs:string" use="required" />
          <xs:attribute name="DependedControl" type="xs:string" use="required" />
          <xs:attribute name="DependedField" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="ControlsType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Содержит набор дочерних графических контролов
      </xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="Splitter" type="BasicControlType" />
      <xs:element name="CheckBox" type="BasicControlType" />
      <xs:element name="CheckedComboBox" type="BasicControlType">
        <xs:annotation>
          <xs:documentation  xml:lang="ru">
            Элемент управления выпадающий список множественного выбора.
            Обязательно устанавливать тип AttributeType в Xml
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="CheckedList" type="BasicControlType">
        <xs:annotation>
          <xs:documentation  xml:lang="ru">
            Элемент управления список множественного выбора.
            Обязательно устанавливать тип AttributeType в Xml
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Color" type="BasicControlType"/>
      <xs:element name="ComboBox" type="BasicControlType"/>
      <xs:element name="DateTime" type="BasicControlType"/>
      <xs:element name="GroupBox" type="BasicControlType"/>
      <xs:element name="ImageBox" type="BasicControlType"/>
      <xs:element name="Label" type="BasicControlType"/>
      <xs:element name="ListBox" type="BasicControlType"/>
      <xs:element name="MaskText" type="BasicControlType"/>
      <xs:element name="Numeric" type="BasicControlType"/>
      <xs:element name="Panel" type="BasicControlType"/>
      <xs:element name="RichText" type="BasicControlType"/>
      <xs:element name="SplitterPanel" type="BasicControlType"/>
      <xs:element name="Tab" type="BasicControlType"/>
      <xs:element name="TabControl" type="BasicControlType"/>
      <xs:element name="TextBox" type="BasicControlType"/>
      <xs:element name="Time" type="BasicControlType"/>
      <xs:element name="TrackBar" type="BasicControlType"/>
      <xs:element name="TreeView" type="BasicControlType"/>
      <xs:element name="RadioGroup" type="BasicControlType"/>
      <xs:element name="WebBrowser" type="BasicControlType"/>
      <xs:element name="RangeTrackBar" type="BasicControlType"/>
    </xs:choice>
  </xs:complexType>
  
  <xs:simpleType name="AttributeTypeType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Типы данных, которые могут быть внесены в конкретный контрол
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="BigInt"            />
      <xs:enumeration value="Bit"               />
      <xs:enumeration value="Char"              />
      <xs:enumeration value="VarChar"           />
      <xs:enumeration value="Text"              />
      <xs:enumeration value="NVarChar"          />
      <xs:enumeration value="Xml"          />
      <xs:enumeration value="NChar"             />
      <xs:enumeration value="NText"             />
      <xs:enumeration value="SmallDateTime"     />
      <xs:enumeration value="Date"              />
      <xs:enumeration value="DateTime"          />
      <xs:enumeration value="DateTime2"         />
      <xs:enumeration value="DateTime"          />
      <xs:enumeration value="DateTimeOffset"    />
      <xs:enumeration value="Money"             />
      <xs:enumeration value="SmallMoney"        />
      <xs:enumeration value="Decimal"           />
      <xs:enumeration value="Float"             />
      <xs:enumeration value="Int"               />
      <xs:enumeration value="Real"              />
      <xs:enumeration value="SmallInt"          />
      <xs:enumeration value="Time"              />
      <xs:enumeration value="TinyInt"           />
      <xs:enumeration value="UniqueIdentifier"  />
      <xs:enumeration value="Image"/>
      <xs:enumeration value="Timestamp"/>
      <xs:enumeration value="Binary"/>
      <xs:enumeration value="VarBinary"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="BasicControlType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Общие свойства для всех контролов
      </xs:documentation>
    </xs:annotation>
    <xs:all>
      <xs:element name="Controls" type="ControlsType"  minOccurs="0"/>
      <xs:element name ="Properties" type="BasicPropertiesType"  minOccurs="0"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="BasicDatasourceType">
    <xs:annotation>
      <xs:documentation xml:lang="ru">
        Конфигурация источника данных
      </xs:documentation>
    </xs:annotation>
    <xs:all>
      <xs:element name="NameOrig" type="xs:string" minOccurs="1">
        <xs:annotation>
          <xs:documentation>
            Имя представления, из которого будут запрашиваться данные
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name ="UseGroupBy" type="xs:boolean" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Использовать группировку
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name ="UseOnlyActive" type="xs:boolean"  minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Выборка только активных полей
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="Fields" minOccurs="1">
        <xs:complexType>
          <xs:annotation>
            <xs:documentation xml:lang="ru">
              Перечень полей для получения
            </xs:documentation>
          </xs:annotation>
          <xs:sequence>
            <xs:element name="Key" type="xs:string" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation>
                  Ключевое поле
                </xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="ParentKey" type="xs:string" minOccurs="0">
              <xs:annotation>
                <xs:documentation>
                  Родительское поле для построения древовидной структуры
                </xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="Display" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation>
                <xs:documentation>
                  Обычное поле
                </xs:documentation>
              </xs:annotation>
              <xs:complexType>
                <xs:simpleContent>
                  <xs:extension base="xs:string">
                    <xs:attribute name="Sort">
                      <xs:annotation>
                        <xs:documentation>
                          Указывает тип сортировки
                        </xs:documentation>
                      </xs:annotation>
                      <xs:simpleType>
                        <xs:restriction base="xs:string">
                          <xs:enumeration value="asc"/>
                          <xs:enumeration value="desc"/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:attribute>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="IsEditable" type="xs:boolean" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Необходимо ли отображать кнопку справочника
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:all>
  </xs:complexType>
  <xs:complexType name="BasicPropertiesType">
    <xs:all>
      <xs:element name="Width" type="xs:positiveInteger" minOccurs="0"/>
      <xs:element name="Height" type="xs:positiveInteger" minOccurs="0"/>
      <xs:element name="Left" type="xs:positiveInteger"  minOccurs="0"/>
      <xs:element name="Top" type="xs:positiveInteger"  minOccurs="0"/>
      <xs:element name="Name" type="xs:string"  minOccurs="0"/>
      <xs:element name="Text" type="xs:string"  minOccurs="0"/>
      <xs:element name="Mask" type="xs:string" minOccurs="0">
        <xs:annotation>
          <xs:documentation>
            Полноценное регулярное выражение (DevExpress.XtraEditors.Mask.MaskType.RegEx)
            Пример: ((\+\d)?\(\d{3}\))?\d{3}-\d\d-\d\d
            +2(444)555-44-55
            (444)555-44-55
            555-44-55
            См.:WinForms Controls>Products>XtraEditors>Editors Features>Mask Editors Overview>Mask Type: Extended Regular Expressions
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="PasswordChar" type="xs:string" minOccurs="0"/>
      <xs:element name="Min" type="xs:integer" minOccurs="0"/>
      <xs:element name="Max" type="xs:integer" minOccurs="0"/>
      <xs:element name="MaxLength" type="xs:positiveInteger" minOccurs="0"/>
      <xs:element name="Step" type="xs:positiveInteger" minOccurs="0"/>
      <xs:element name="Enabled" type="xs:boolean"  minOccurs="0"/>
      <xs:element name="Required" type="xs:boolean"  minOccurs="0"/>
      <xs:element name="AttributeType" type="AttributeTypeType"  minOccurs="0"/>
      <xs:element name="XMLAttribute" type="xs:string"  minOccurs="0"/>
      <xs:element name="Datasource" type="BasicDatasourceType"  minOccurs="0"/>
      <xs:element name="Orientation" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="Vertical"/>
            <xs:enumeration value="Horizontal"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="Dock" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="None"/>
            <xs:enumeration value="Top"/>
            <xs:enumeration value="Bottom"/>
            <xs:enumeration value="Left"/>
            <xs:enumeration value="Right"/>
            <xs:enumeration value="Fill"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:all>
  </xs:complexType>
</xs:schema>